import type { CommonFormRef } from '@/components/CommonForm';
import type { ActionType } from '@ant-design/pro-components';
import { useCallback, useState } from 'react';

/**
 * 处理表单相关逻辑
 */
export function usePageTemplateForm<T extends Record<string, any>>(
  rowKey: string | ((record: T) => string),
  formRef: React.RefObject<CommonFormRef>,
  crudService: any,
  onFormSubmit?: (values: Record<string, any>) => Promise<void>,
  onFormCancel?: () => void,
) {
  const [formVisible, setFormVisible] = useState(false);
  const [formMode, setFormMode] = useState<'create' | 'edit' | 'view'>('create');
  const [currentRecord, setCurrentRecord] = useState<T | null>(null);

  // 统一的表单打开处理
  const handleFormOpen = useCallback(
    async (actionType: 'create' | 'edit' | 'copy' | 'view', record?: T) => {
      const modeMap = { create: 'create', edit: 'edit', copy: 'create', view: 'view' };
      const mode = modeMap[actionType] as 'create' | 'edit' | 'view';

      setFormMode(mode);
      setFormVisible(true);

      if (actionType === 'create') {
        setCurrentRecord(null);
        formRef.current?.resetFields();
      } else if (actionType === 'edit' || actionType === 'view') {
        // 如果有 record，先使用列表数据打开抽屉，然后尝试获取 detail 数据
        if (record) {
          // 先设置当前记录并打开抽屉，使用列表数据
          setCurrentRecord(record);
          setTimeout(() => {
            formRef.current?.setFieldsValue(record);
          }, 100);

          // 异步尝试从 detail 接口获取详情数据（如果配置了）
          // 注意：如果 detail 接口未配置，crudService.detail 会抛出错误，我们捕获后使用列表数据
          try {
            const key = typeof rowKey === 'function' ? rowKey(record) : record[rowKey];
            // 尝试调用 detail 方法获取详情
            if (crudService?.detail) {
              const detailData = await crudService.detail(key);
              // 如果成功获取到详情数据，更新表单
              if (detailData) {
                setCurrentRecord(detailData);
                setTimeout(() => {
                  formRef.current?.setFieldsValue(detailData);
                }, 100);
              }
            }
          } catch (error: any) {
            // 如果 detail 接口未配置（错误信息包含 'Detail endpoint not configured'），
            // 或其他原因导致失败，继续使用列表数据（已设置）
            // 不额外显示错误，因为列表数据已经可用，用户体验更好
          }
        } else {
          setCurrentRecord(null);
        }
      } else if (actionType === 'copy') {
        setCurrentRecord(null);
        setTimeout(() => {
          if (record) {
            const key = typeof rowKey === 'function' ? 'id' : rowKey;
            const { [key]: id, ...recordData } = record;
            formRef.current?.setFieldsValue(recordData);
          }
        }, 100);
      }
    },
    [rowKey, formRef, crudService],
  );

  // 表单提交
  const handleFormSubmit = useCallback(
    async (actionRef?: React.MutableRefObject<ActionType | undefined>) => {
      if (!formRef.current || !crudService) return;

      try {
        const values = await formRef.current.validateFields();

        if (onFormSubmit) {
          await onFormSubmit(values);
        } else {
          const key = typeof rowKey === 'function' ? 'id' : rowKey;
          if (formMode === 'create') {
            await crudService.create(values);
          } else {
            await crudService.update(currentRecord?.[key], values);
          }
        }

        setFormVisible(false);
        actionRef?.current?.reload();
      } catch (error) {
        // 验证错误或网络错误已处理
      }
    },
    [formRef, crudService, onFormSubmit, formMode, currentRecord, rowKey],
  );

  // 表单取消
  const handleFormCancel = useCallback(() => {
    if (onFormCancel) onFormCancel();
    setFormVisible(false);
    setCurrentRecord(null);
  }, [onFormCancel]);

  return {
    formVisible,
    formMode,
    currentRecord,
    handleFormOpen,
    handleFormSubmit,
    handleFormCancel,
  };
}
